接續昨天的連接字串(connectionstring)保護,無論是加密連接字串或是從其他安全機制取得密碼,免不了都要修改DAL(Data Access Layer)資料存取層的程式,江湖傳說懶是工程師的美德,有著神祕推著人類進步的力量,那麼這樣的美德我們.NET工程師能不能培養?
哈!有的! ASP.NET有的支援!
Aspnet_regiis.exe
),我們可以指定加密或解密Web組態檔的區段。我們來試試無痛加密升級。
我們來試試看加密組態檔案中的connectionStrings區段
啟動開發人員命令提示字元
Windows
+ Q
+ 輸入VS 2015
> 滑鼠滑到開發人員命令提示字元 > 右鍵系統人員執行
把web.config放在指定目錄下,假設我們放在E:\Test\Web,然後執行以下Command加密:
aspnet_regiis -pef "connectionStrings" "E:\test\web" -prov "RsaProtectedConfigurationProvider"
加密後的連線字串
執行以下Command設定儲存加密金鑰容器的權限
金鑰容器權限
aspnet_regiis -pa "NetFrameworkConfigurationKey" "stanleyjui"
預設金鑰容器名稱是NetFrameworkConfigurationKey
試試看從.NET程式取得連接字串
[TestMethod]
public void TestSqlConnectionStringFromConfigEncrypted()
{
//簡單連線資料庫查詢SQL Server版本資料
using (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["ironman"].ConnectionString))
{
Console.WriteLine(conn.ConnectionString);
}
}
執行結果:
果然自動解密!
執行以下Command進行組態檔案解密
aspnet_regiis -pdf "connectionStrings" "E:\test\web"
組態檔案順利解開!
如果希望與SQL連線建立後,迅速清除記憶體中連接字串的密碼資訊,記得不要把PersistSecurityInfo設定成True
。
PersistSecurityInfo預設是false,SqlConnection.open()後就會清除密碼資訊了。
sqlsb.PersistSecurityInfo = false;
可以的,但我們得先把app.config改名成web.config,加密後再rename回app.config。
設定加密時如果出現以下訊息:
無法使用提供者 'RsaProtectedConfigurationProvider' 加密區段 'connectionStrings'。來自這個提供者的錯誤訊息為: 物件已存在。
可以注意我們是否以管理員身份執行。
AP執行時,如果出現:
無法開啟RSA金鑰容器訊息
可以注意是否有將RSA金鑰容器權限賦予執行帳號。
這兩天我們實作了安全的組態管理,設法保護了組態檔案內的連接字串,確保經過授權後的應用程式(AP),才能取得資料庫內的資訊,同時也讓重要的密碼資訊,確保只有持有金鑰的執行程式才能取出。
匯出加密金鑰
https://msdn.microsoft.com/zh-tw/library/2w117ede(v=vs.100).aspx#匯出及匯入 RSA 金鑰容器
組態檔案加密
https://msdn.microsoft.com/zh-tw/library/zhhddkxy(v=vs.100).aspx
組態檔案加密
https://dotblogs.com.tw/huanlin/2008/04/23/3226
托斯卡尼警車
2011.10攝於Toscana,Italy